<!DOCTYPE html>
<!--
  Copyright 2011 Google Inc.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

  Original slides: Marcin Wichary (mwichary@google.com)
  Modifications: Chrome DevRel Team (chrome-devrel@googlegroups.com)
                 Alex Russell (slightlyoff@chromium.org)
                 Brad Neuberg
-->

<!-- GB: modifications for s9 template pack:
 
  o removed offline manifest
  o removed disclaimer; it's just a prototype anyway
  o removed google analytics script code
  o removed google maps script code
  o removed all slides

  o in js/utils.js changed line 541pp queryAll('.transitionSlide')
 
     - looks for h1 (not h2) and doesn't include img (icon)

  o in styles/commons.css commented out rules for li and bullets
 
   li {
    list-style: none;
    padding: 10px 0;
   }
   .bullets {
  font-size: 40px;
  }
  .bullets li::before {
    content: '· ';
  }
-->

<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=Edge;chrome=1" />
    <title>操作系统 -- 丘文峰</title>
    <link href="http://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans+Mono" rel="stylesheet" type="text/css" />
    <link id="prettify-link" href="src/prettify/prettify.css" rel="stylesheet" disabled />
    <link href="styles/fonts.css" rel="stylesheet" type="text/css" media="screen" />
    <link href="styles/presentation.css" rel="stylesheet" type="text/css" media="screen" />
    <link href="styles/common.css" rel="stylesheet" type="text/css" media="screen" />
    <link class="theme" href="styles/default.css" rel="stylesheet" type="text/css" media="screen" />
    <link class="theme" href="styles/moon.css" rel="stylesheet" type="text/css" media="screen" />
    <link class="theme" href="styles/sand.css" rel="stylesheet" type="text/css" media="screen"/>
    <link class="theme" href="styles/sea_wave.css" rel="stylesheet" type="text/css" media="screen"/>
  </head>
  <body>
    <div id="flex-container">
    <nav id="helpers">
      <button title="Previous slide" id="nav-prev" class="nav-prev">&#8701;</button> 
      <button title="Jump to a random slide" id="slide-no">5</button> 
      <button title="Next slide" id="nav-next" class="nav-next">&#8702;</button>
      <menu>
        <button type="checkbox" data-command="toc" title="Table of Contents" class="toc">TOC</button>
        <!-- <button type="checkbox" data-command="resources" title="View Related Resources">&#9734;</button> -->
        <button type="checkbox" data-command="notes" title="View Slide Notes">&#9999;</button>
        <button type="checkbox" data-command="source" title="View slide source">&#8635;</button>
        <button type="checkbox" data-command="help" title="View Help">?</button>
      </menu>
    </nav>
    <div class="slides">
      <div id="presentation-counter">Loading...</div>
        <div class="slide" id="landing-slide">
          <section class="middle">
            <p>This presentation is an HTML5 website</p>
            <p>Press <span id="left-init-key" class="key">&rarr;</span> key to advance.</p>
          </section>
          <aside class="note">
            <section>
              Welcome! (This field is for speaker notes and commentary.)
            </section>
          </aside> 
        </div>

        <div class="slide" id="controls-slide">
          <header>Slides controls</header>
          <section>
            <ul>
              <li><span class="key">&larr;</span> and <span class="key">&rarr;</span> to move around.</li>
              <li><span class="key">Ctrl/Command</span> and <span class="key">+</span> or <span class="key">-</span> to zoom in and out if slides don’t fit.</li>
              <li><span class="key">S</span> to view page source.</li>
              <li><span class="key">T</span> to change the theme.</li>
              <li><span class="key">H</span> to toggle syntax highlight.</li>
              <li><span class="key">N</span> to toggle speaker notes.</li>
              <li><span class="key">3</span> to toggle 3D effect.</li>
              <li><span class="key">0</span> to toggle help.</li>
            </ul>
          </section>
        </div>

        <div class="slide" id="title-slide">
          <section class="middle">
            <hgroup>
              <h1>
                操作系统
              </h1>
              <h2>
                操作系统用户界面
              </h2>
			  <h3>
                丘文峰
              </h3>
            </hgroup>
          </section>
        </div>

        <div class="slide" id="table-of-contents">
          <header><h1>本章内容</h1></header>
          <section>
            <ul id="toc-list">
            </ul>
          </section>
        </div>


        
        <div class="slide transitionSlide" id="slide2">
          <header><h1 id="section">作业</h1></header>
          <section>
              <!-- === begin markdown block =====================================================

      generated by markdown 1.0.0 on Ruby 1.8.7 (2012-06-29) [i386-mingw32]
                on Tue Sep 11 09:22:37 +0800 2012 with Markdown engine kramdown (0.13.8)
                  using options { !to be done! }
  -->

<!-- _S9SLIDE_ -->
<h1 id="section">作业</h1>

<!-- begin code{} -->
<div class="code"><pre class="brush: ruby toolbar: false gutter: true">
#include &lt;iostream&gt;
using namespace std;

void loop2(int *a, int len)
{
	int x;
	for (int k=1;  k&lt;=len; k++)
	{
		x = k;
		cout &lt;&lt;x&lt;&lt; &quot; &quot;;
		for (x=a[x]; x!=k; x=a[x])
			cout &lt;&lt;x&lt;&lt; &quot; &quot;;
		cout &lt;&lt; endl;
	}
}

int main(int argc, char **argv)
{
	int p[] ={7,4,7,3,2,1,5,6};
	loop2(p, p[0]);
	return 0;
}
</pre></div>
<!-- end code -->



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide3">
          <header><h1 id="section-1">2.1 简介</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-1">2.1 简介</h1>

<p>用户界面是操作系统的重要组成部分，用户界面负责用户和操作系统之间的交互。</p>

<h4 id="section-2">三种用户</h4>

<ul>
  <li>普通用户 ， 计算机应用服务， 例如 事务处理， 过程控制</li>
  <li>管理员用户， 计算机系统安全</li>
  <li>程序开发人员， 开发APP</li>
</ul>

<h4 id="section-3">操作系统的用户界面针对核心用户不同，且具有时效性</h4>

<h4 id="section-4">概念</h4>

<p>操作系统的操作命令界面作为命令控制界面， 也称为命令提示符。</p>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide4">
          <header><h1 id="section-5">2.2 一般用户的输入输出界面</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-5">2.2 一般用户的输入输出界面</h1>

<h4 id="section-6">作业的定义</h4>

<p><img src="images/2/1.jpg" alt="一般编程过程" /></p>

<ul>
  <li>从输入开始到输出结束，用户要求计算机所做的有关该次业务处理的全部工作称为一个作业。</li>
  <li>作业由不同的顺序相连的作业步组成。</li>
  <li>作业步是在一个作业的处理过程中计算机所做的相对独立的工作。</li>
  <li>一般来说，每一个作业步产生下一个作业步的输入文件。★</li>
  <li>作业由程序、数据和作业说明书组成， 在批处理系统中，作业是抢占内存的基本单位。</li>
</ul>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide5">
          <header><h1 id="section-7">2.2.2 作业组织</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-7">2.2.2 作业组织</h1>

<h4 id="section-8">作业说明书</h4>

<p><img src="images/2/2.jpg" alt="一般编程过程" /></p>

<p>作业说明书包含三方面</p>

<ul>
  <li>作业的基本描述</li>
  <li>作业控制描述</li>
  <li>作业资源要求描述</li>
</ul>

<h4 id="bathttpbaikebaiducomview295769htm"><a href="http://baike.baidu.com/view/295769.htm">批处理文件（.bat）示例</a></h4>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide6">
          <header><h1 id="section-9">2.2.3 一般用户的输入输出方式</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-9">2.2.3 一般用户的输入输出方式</h1>

<h4 id="section-10">5种输入输出方式</h4>

<ul>
  <li>联机输入输出方式， 用于用户与系统的实时交互</li>
  <li>脱机输入输出方式， 为了解决设备联机输入输出时速度太慢问题</li>
  <li>直接耦合方式， 解决脱机输入输出方式的人工干预缺点</li>
  <li>SPOOLING系统</li>
  <li>网络联机方式，在网络下使用上述四种方式</li>
</ul>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide7">
          <header><h1 id="section-11">2.2.3 直接耦合方式</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-11">2.2.3 直接耦合方式</h1>

<p><img src="images/2/3.jpg" alt="直接耦合方式" /></p>

<p>在直接耦合方式中，慢速的输入输出过程仍由外围机自己管理，而对公用存储器中的大量数据的高速读写则由主机完成。直接耦合方式需要一个大容量的公用存储器，把多台外围机、主机和公用存储器固定连接起来。</p>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide8">
          <header><h1 id="spooling">2.2.3 SPOOLING系统</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="spooling">2.2.3 SPOOLING系统</h1>

<p><img src="images/2/4.jpg" alt="SPOOLING系统" /></p>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide9">
          <header><h1 id="section-12">2.3 命令控制界面</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-12">2.3 命令控制界面</h1>

<h4 id="section-13">两个接口界面</h4>

<ul>
  <li>系统为用户提供的各种命令接口</li>
  <li>系统调用</li>
</ul>

<h4 id="section-14">操作系统的命令控制界面就是用来组织和控制作业运行的</h4>

<h4 id="section-15">作业控制的主要方式有两种</h4>

<ul>
  <li>脱机方式，不可交互， 批处理</li>
  <li>联机方式，可交互， 命令行</li>
</ul>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide10">
          <header><h1 id="section-16">2.3 联机方式的命令</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-16">2.3 联机方式的命令</h1>

<h4 id="section-17">命令大致可以分为以下7类</h4>

<ul>
  <li>环境设置</li>
  <li>执行权限管理</li>
  <li>系统管理</li>
  <li>文件管理</li>
  <li>编辑、编译、链接装配和执行编辑命令被用来帮助用户输入用户文件。</li>
  <li>通信</li>
  <li>资源要求</li>
</ul>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide11">
          <header><h1 id="linux">2.4 Linux命令控制界面</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="linux">2.4 Linux命令控制界面</h1>

<p><img src="images/2/5.jpg" alt="ReadHat Linux 9.0的窗口界面示例" /></p>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide12">
          <header><h1 id="linux-1">2.4 Linux命令控制界面</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="linux-1">2.4 Linux命令控制界面</h1>

<h4 id="linux9">一般来说， Linux命令主要包括以下9类:</h4>

<ul>
  <li>系统维护及管理命令， 例如 date, setenv等</li>
  <li>文件操作及管理命令， 例如 ls, find等</li>
  <li>进程管理命令， 例如kill, at等</li>
  <li>磁盘及设备管理命令， 例如df, du, mount等</li>
  <li>用户管理命令， 例如adduser, userdel等</li>
  <li>文档操作命令， 例如csplit, sort等</li>
  <li>网络通信命令， 例如netstat, ifconfig等</li>
  <li>程序开发命令， 例如cc, link等</li>
  <li>X Window管理命令, 例如startx, XE86Setup等</li>
</ul>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide13">
          <header><h1 id="shell">2.4 Shell程序</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="shell">2.4 Shell程序</h1>

<h4 id="shell6">一个Shell程序由以下6部分组成</h4>

<ul>
  <li>命令或其他Shell程序 </li>
  <li>位置参数</li>
  <li>变量及特殊字符</li>
  <li>表达式比较</li>
  <li>控制流语句， 例如while, case等</li>
  <li>函数</li>
</ul>

<!-- begin code{} -->
<div class="code"><pre class="brush: ruby toolbar: false gutter: true">
mkdir backup
for filein 'ls'
do
	cp $file backup/ $ file
	if [$ &gt; -ne 0] then
		echo &quot;copying $ file error&quot;
	fi
done
</pre></div>
<!-- end code -->



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide14">
          <header><h1 id="windows">2.4.2 Windows的命令控制界面</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="windows">2.4.2 Windows的命令控制界面</h1>

<h4 id="windowscmdexe">Windows通过自带的命令行解释器cmd.exe为用户提供交互：</h4>

<ul>
  <li>系统信息命令， 例如Time, Data, Mem, Diverquery和SystemInfo等</li>
  <li>系统操作命令， 例如Shutdown, Runas和Taskkill等</li>
  <li>文件系统命令， 例如Copy, Del和Mkdir等</li>
  <li>网络通信命令， 例如Ping, Netstat和Router等</li>
</ul>

<h4 id="section-18">命令格式</h4>

<ul>
  <li>运行一条命令，接着运行第二条命令: Command1 &amp; Command2</li>
  <li>成功运行一条命令，才运行第二条命令: Command1 &amp;&amp; Command2</li>
  <li>
    <table>
      <tbody>
        <tr>
          <td>失败运行一条命令， 才运行第二条命令: Command1</td>
          <td>&nbsp;</td>
          <td>Command2</td>
        </tr>
      </tbody>
    </table>
  </li>
  <li>分组和嵌套命令： (Command1 &amp; Command2)</li>
  <li>参数： Command parameter1;parameter2</li>
</ul>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide15">
          <header><h1 id="windows-1">2.4.2 Windows的命令控制界面</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="windows-1">2.4.2 Windows的命令控制界面</h1>

<!-- begin code{} -->
<div class="code"><pre class="brush: ruby toolbar: false gutter: true">
systeminfo &amp; mem
</pre></div>
<!-- end code -->

<!-- begin code{} -->
<div class="code"><pre class="brush: ruby toolbar: false gutter: true">
@echo off 
mkdir test
echo hello
pause
</pre></div>
<!-- end code -->



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide16">
          <header><h1 id="section-19">2.4.2 一个批处理例子</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-19">2.4.2 一个批处理例子</h1>

<!-- begin code{} -->
<div class="code"><pre class="brush: ruby toolbar: false gutter: true">
exam2.bat:
			@echo off
			mem&gt;%1/meminfo.txt
			echo generate memoryinfo Ok!
exam3.bat:
			@echo off
			type %1\*.txt
			echo type ok!

exam1.bat:
			@echo off
			mkdir test
			call exam2.bat test
			call exam3.bat test
			echo call OK!
			pause
</pre></div>
<!-- end code -->



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide17">
          <header><h1 id="section-20">2.4.2 一个批处理例子</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-20">2.4.2 一个批处理例子</h1>

<p><img src="images/2/6.jpg" alt="相互调用批处理示例" /></p>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide18">
          <header><h1 id="section-21">2.5 系统调用</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-21">2.5 系统调用</h1>

<h4 id="section-22">系统调用大致可分为6大类</h4>

<ul>
  <li>设备管理</li>
  <li>文件管理</li>
  <li>进程控制</li>
  <li>进程通信</li>
  <li>存储管理</li>
  <li>线程管理</li>
</ul>

<h4 id="section-23">陷阱</h4>

<p>在系统中为控制系统调用服务的机构称为陷阱处理机构</p>

<h4 id="section-24">陷阱指令（访管指令）</h4>

<p>由于系统调用引起处理机中断的指令称为陷阱指令（或称为访管指令）</p>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide19">
          <header><h1 id="section-25">2.5 系统调用</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-25">2.5 系统调用</h1>

<p><img src="images/2/7.jpg" alt="系统调用的处理过程" /></p>

<h4 id="section-26">用户态与系统态</h4>

<p>一般把处理机在用户程序中执行称为用户态，而把处理机在系统程序中执行称为系统态。</p>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide20">
          <header><h1 id="linux-2">2.6 Linux的系统调用</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="linux-2">2.6 Linux的系统调用</h1>

<h4 id="linux-3">Linux由两部分组成：</h4>

<ul>
  <li>核心函数，部分提供实现系统调用功能的共享代码，作为操作系统的核心程序驻留在内存中</li>
  <li>接口函数，部分提供给应用程序API接口，它把系统调用号，入口参数地址传送给相应的核心函数</li>
</ul>

<h4 id="linux6">Linux系统调用，大致可分为如下6类:</h4>

<ul>
  <li>设备管理的系统调用</li>
  <li>文件系统操作的系统调用</li>
  <li>进程控制的系统调用</li>
  <li>存储管理的系统调用</li>
  <li>管理用的系统调用</li>
  <li>通信的系统调用</li>
</ul>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide21">
          <header><h1 id="linux-4">2.6 Linux的系统调用</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="linux-4">2.6 Linux的系统调用</h1>

<!-- begin code{} -->
<div class="code"><pre class="brush: ruby toolbar: false gutter: true">
#include &lt;fcntl.h&gt;
#include &lt;sys/stat.h&gt;
#define SIZE 1

void filecopy(char* infile, char * outfile)
{
	char Buffer[SIZE];
	int in_fh, out_fh, count;
	if (in_fh = open(infile, O_RDONLY))==-1) // 以只读模式打开输入文件
		printf(&quot;Opening infile&quot;);
	if (out_fh = open(outfile, (O_WRONLY|O_CREAT|O_TRUNC), 
		(S_IRUSER|S_IWUSR))==-1)	//以读写模式新建一个文件
		printf(&quot;Opening outfile&quot;);
	while((count == read(in_fh, Buffer, sizeof(Buffer)))&gt;0)
		if (write(out_fh, Buffer, count)!=count) // 复制
			printf(&quot;Writing date&quot;);
	if (count==-1)
		printf(&quot;Reading date&quot;);
	close(in_fh); // 关闭输入文件
	close(out_fh); // 关闭输出文件
}
</pre></div>
<!-- end code -->



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide22">
          <header><h1 id="windows-2">2.6.2 Windows系统调用</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="windows-2">2.6.2 Windows系统调用</h1>

<h4 id="windowsapi5">Windows通过提供API进行系统调用，共有5类</h4>

<ul>
  <li>窗口管理类</li>
  <li>图形设备接口类</li>
  <li>系统服务类</li>
  <li>国际特性类</li>
  <li>网络服务类</li>
</ul>



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide23">
          <header><h1 id="windows-3">2.6.2 Windows系统调用</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="windows-3">2.6.2 Windows系统调用</h1>

<!-- begin code{} -->
<div class="code"><pre class="brush: ruby toolbar: false gutter: true">
#include &lt;windows.h&gt;
//入口函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
				PSTR szCmdLine, intiCmdshow)
{
	HANDLE hFile;
	LPTSTR lpBuffer=&quot;Hello World!&quot;;
	// 创建文件
	hFile = CreateFile(&quot;C:\\File.txt&quot;, GENERIC_READ | GENERIC_WRITE, 
		0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	CloseHandle(hFile);
	TCHAR szBuf[128];
	DWORD dwRead;
	DWORD dwWritten;
	// 打开文件
	hFile = CreateFile(&quot;C:\\File.txt&quot;, GENERIC_READ | GENERIC_WRITE, 
		0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	// 向文件写入一个字符串
	WriteFile(hFile, IpBuffer, strlen(IpBuffer)+1, &amp;dwRead, NULL);
	SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
	// 从文件中读出一个字符串并将它显示在对话框中
	if (ReadFile(hFile, szBuf, strlen(ipBuffer)+1, &amp;dwWritten, NULL))
	{
		MessageBox(NULL, szBuf, &quot;EXAM&quot;, MB_OK);
	}
	CloseHandle(hFile);
}

</pre></div>
<!-- end code -->



          </section>
        </div>
        
        <div class="slide transitionSlide" id="slide24">
          <header><h1 id="section-27">作业</h1></header>
          <section>
              <!-- _S9SLIDE_ -->
<h1 id="section-27">作业</h1>
<p>使用Windows系统调用写一个拷贝文件夹的程序</p>
<!-- === end markdown block ===================================================== -->

          </section>
        </div>
        


        <div id="speaker-note" class="invisible" style="display: none;"></div>
        <aside id="help" class="sidebar invisible" style="display: none;">
          <table>
            <caption>Help</caption>
            <tbody>
              <tr>
                <th>Move Around</th>
                <td>&larr;&nbsp;&rarr;</td>
              </tr>
              <tr>
                <th>Source File</th>
                <td>s</td>
              </tr>
              <tr>
                <th>Change Theme</th>
                <td>t</td>
              </tr>
              <tr>
                <th>Syntax Highlight</th>
                <td>h</td>
              </tr>
              <tr>
                <th>Speaker Notes</th>
                <td>n</td>
              </tr>
              <tr>
                <th>Toggle 3D</th>
                <td>3</td>
              </tr>
              <tr>
                <th>Help</th>
                <td>0</td>
              </tr>
            </tbody>
          </table>
        </aside>

    </div> <!-- slides -->
    </div>
    
    <!--[if lt IE 9]>
    <script 
      src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js">
    </script>
    <script>CFInstall.check({ mode: "overlay" });</script>
    <![endif]-->

    <script src="src/prettify/prettify.js" onload="prettyPrint();" defer></script>
    <script src="js/utils.js"></script>
  </body>
</html>